package maple.thelittleredbook.recommendation.task;

import lombok.extern.slf4j.Slf4j;
import maple.thelittleredbook.recommendation.service.ContentFeatureService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 内容特征生成定时任务
 * 定期处理内容特征生成队列
 */
@Slf4j
@Component
public class ContentFeatureTask {

    private final ContentFeatureService contentFeatureService;

    @Autowired
    public ContentFeatureTask(ContentFeatureService contentFeatureService) {
        this.contentFeatureService = contentFeatureService;
    }

    /**
     * 应用启动后的初始化任务
     * 清理异常中断的处理任务
     */
    @EventListener(ApplicationReadyEvent.class)
    public void onApplicationReady() {
        log.info("应用启动完成，开始初始化内容特征任务");

        try {
            // 清理启动前异常中断的处理任务
            Integer cleanupCount = contentFeatureService.cleanupTimeoutProcessingTasks(null);
            log.info("应用启动时清理异常中断任务完成，清理数量: {}", cleanupCount);
        } catch (Exception e) {
            log.error("应用启动时清理异常中断任务失败", e);
        }
    }

    /**
     * 内容特征生成定时任务
     * 每30秒执行一次，处理待生成特征的内容
     * fixedDelay=30000 表示上一次执行完毕后，等待30秒再执行
     * initialDelay=15000 表示应用启动后等待15秒再开始第一次执行
     */
    @Scheduled(fixedDelay = 30000, initialDelay = 15000)
    public void processContentFeatures() {
        log.debug("内容特征生成定时任务启动");

        try {
            // 调用服务层方法处理内容特征生成
            contentFeatureService.processFeatureGeneration();
        } catch (Exception e) {
            // 捕获所有异常，确保定时任务不会因为异常而停止
            log.error("处理内容特征生成时发生错误: {}", e.getMessage(), e);
        }

        log.debug("内容特征生成定时任务完成");
    }
}